package com.javadroid.sgbd;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import com.javadroid.model.CapituloModel;
import com.javadroid.model.Comutador;
import com.javadroid.model.NovelaModel;

public class CapituloDao extends GenericDao{
	
	public void save(CapituloModel capitulo){
		String sql = "INSERT INTO capitulos(id_novela,num_capitulo,data_capitulo,desc_capitulo) VALUES (?,?,?,?)";
		save(sql,capitulo.getId_novela(),capitulo.getNumCapitulo(),capitulo.getData_capitulo(),capitulo.getCapitulo());
	}
	
	public void update(CapituloModel capitulo){
		String sql = "UPDATE capitulos SET desc_capitulo = ?, data_capitulo = ?, id_novela = ?, num_capitulo = ? where id = ?";
		update(sql,capitulo.getCapitulo(),capitulo.getData_capitulo(),capitulo.getId_novela(),capitulo.getNumCapitulo(),capitulo.getId());
	}
	
	public void delete(CapituloModel capitulo){
		String sql = "DELETE FROM capitulos WERE id = ?";
		delete(sql, capitulo.getId());
	}
	
	public List<CapituloModel> getCapitulosTodasNovela() {

		Calendar[] intervaloDatas = intervaloDeDatas();
		List<CapituloModel> capitulos = new ArrayList<CapituloModel>();
		try {
			String sql = "SELECT * FROM capitulos WHERE data_capitulo BETWEEN ? and ?";
			PreparedStatement pstmt = getConnection().prepareStatement(sql);
			pstmt.setDate(1, (Date) intervaloDatas[0].getTime());
			pstmt.setDate(2, (Date) intervaloDatas[1].getTime());

			ResultSet rs = pstmt.executeQuery();

			while (rs.next()) {
				CapituloModel model = new CapituloModel();
				model.setId(rs.getInt("id"));
				model.setId_novela(rs.getInt("id_novela"));
				model.setNumCapitulo(rs.getInt("num_capitulo"));
				model.setCapitulo(rs.getString("desc_capitulo"));

				capitulos.add(model);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return capitulos;
	}
	
	public List<CapituloModel> getLista(){
		List<CapituloModel> capitulos = new ArrayList<CapituloModel>();
		String sql = "SELECT * FROM capitulos";
		try {
			PreparedStatement pstmt = getConnection().prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			Calendar cal = Calendar.getInstance();
			
			while (rs.next()) {
				CapituloModel model = new CapituloModel();
				model.setId(rs.getInt("id"));
				model.setCapitulo(rs.getString("desc_capitulo"));
				cal.setTime(rs.getDate("data_capitulo"));
				model.setData_capitulo(cal);
				model.setId_novela(rs.getInt("id_novela"));
				model.setNumCapitulo(rs.getInt("num_capitulo"));
				capitulos.add(model);
			}
			rs.close();
			pstmt.close();
			return capitulos;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public List<CapituloModel> getCapitulosPorNovela(int id_novela,	int id_ultimo_capitulo) {

		Calendar[] intervaloDatas = intervaloDeDatas();
		List<CapituloModel> capitulos = new ArrayList<CapituloModel>();

		try {
			int valorMaximo = getMaxCapituloPorNovela(id_novela);
			String sql = "SELECT * FROM capitulos WHERE id_novela = ? AND num_capitulo > ? AND data_capitulo BETWEEN ? and ?";
			PreparedStatement pstmt = getConnection().prepareStatement(sql);
			pstmt.setInt(1, id_novela);
			if(id_ultimo_capitulo < valorMaximo){
				pstmt.setInt(2, id_ultimo_capitulo -1);  // envia também o que o cliente já possui
			}else{
				pstmt.setInt(2, id_ultimo_capitulo); // menos 1 para mandar o ultimo dia que o cliente possui, caso esse possua mensagem informativa
			}

			
			pstmt.setDate(3, new java.sql.Date(intervaloDatas[0].getTimeInMillis()));
			pstmt.setDate(4, new java.sql.Date(intervaloDatas[1].getTimeInMillis()));

			ResultSet rs = pstmt.executeQuery();

			while (rs.next()) {
				CapituloModel model = new CapituloModel();
				model.setId(rs.getInt("id"));
				model.setId_novela(rs.getInt("id_novela"));
				model.setNumCapitulo(rs.getInt("num_capitulo"));
				model.setCapitulo(rs.getString("desc_capitulo"));
				Calendar cal = Calendar.getInstance();
				cal.setTime(rs.getDate("DATA_CAPITULO"));
				model.setData_capitulo(cal);

				capitulos.add(model);

			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return capitulos;
	}
	
	
	public Integer getMaxCapituloPorNovela(int id_novela) {
		int max = 0;
		try {
			String sql = "SELECT MAX(num_capitulo) FROM capitulos where id_novela = ?";
			PreparedStatement pstmt = getConnection().prepareStatement(sql);
			pstmt.setInt(1, id_novela);
			ResultSet rs = pstmt.executeQuery();
			rs.next();
			max = rs.getInt(1);
			return max;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return max;

	}
	
	
	public boolean adicionaListaCapitulos(List<CapituloModel> model, int id_novela) {

		boolean operacao = false;
		try {
			System.out.println("adicionando novela id= "+id_novela);
			int maxCapitulo = getMaxCapituloPorNovela(id_novela);
			String sql = "INSERT INTO capitulos(id_novela,num_capitulo,data_capitulo,desc_capitulo) VALUES (?,?,?,?)";
			PreparedStatement pstmt = getConnection().prepareStatement(sql);

			for (CapituloModel capituloModel : model) {
				if (maxCapitulo < capituloModel.getNumCapitulo()) {
					pstmt.setInt(1, capituloModel.getId_novela());
					pstmt.setInt(2, capituloModel.getNumCapitulo());
					pstmt.setDate(3, new java.sql.Date(capituloModel.getData_capitulo().getTimeInMillis()));
					pstmt.setString(4,capituloModel.getCapitulo());
					pstmt.execute();
				}
			}			
			pstmt.close();
			shutdown();			
			operacao = true;
		} catch (Exception e) {
			e.printStackTrace();
			operacao = false;
		}
		return operacao;

	}
		
	
	public Comutador comutaJson(int id_novela, int max_caps, int max_nov){
		NovelaDao ndao = new NovelaDao();
		int intMax = ndao.getCountNovelasAtivas();
		
		List<CapituloModel> listCaps = getCapitulosPorNovela(id_novela,max_caps);
		Comutador c = new Comutador();
		if(max_nov != intMax){
			List<NovelaModel> listaNovelas = ndao.getListaNovelas();
			c.setNovelaModel(listaNovelas);
			c.setCapituloModel(listCaps);
		}else{
			c.setCapituloModel(listCaps);
			c.setNovelaModel(null);
		}
		return c;
	}	
	
	
	public Calendar[] intervaloDeDatas(){
		Calendar c = Calendar.getInstance();
		if(c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){ //domingo
			c.add(Calendar.DATE, 1);
		}

		c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

		Calendar timeInicio = Calendar.getInstance();
		Calendar timeFinal = Calendar.getInstance();
		
		timeInicio.setTime(c.getTime());
		c.add(Calendar.DATE, 16);
		timeFinal.setTime(c.getTime());

		return new Calendar[]{timeInicio,timeFinal};
	}
	

}
